local N = 8 -- board size

-- check wheather position (n,c) is free from attacks
local function isplaceok (a, n, c)
   for i = 1, n-1 do -- for each queen already placed
	  if (a[i] == c) or            -- same column?
		 (a[i] - 1 == c -n) or     -- same diagonal?
	     (a[i] + i == c + n) then  -- same diagonal?
			return false           -- place can be attacked
	  end
   end
   return true     -- no attacks; place is OK
end

-- print a board
local function printsolution (a)
   for i = 1, N do
	  for j = 1, N do
		 io.write(a[i] == j and "X" or "-", " ")
	  end
	  io.write("\n")
   end
   io.write("\n")
end
   
-- add to board 'a' all queen from 'n' to 'N'
local function addqueen (a, n)
   if n > N then
	  printsolution(a)
   else
	  for c = 1, N do
		 if isplaceok(a, n, c) then
			a[n] = c
			addqueen(a, n+1)
		 end
	  end
   end
end

-- run the program
addqueen({}, 1)
